#include <iostream>
#include <signal.h>
#include <unistd.h>
using namespace std;



// 如果我们不想等待子进程，并且我们还想让子进程退出之后，自动释放僵尸子进程

int main()
{
    signal(SIGCHLD,SIG_IGN);
    if(fork() == 0)
    {
        cout << "child:" << getpid() << endl;
        sleep(5);
        exit(0);
    }
    while(true)
    {
        cout << "parent:" << getpid() << "执行我自己的任务" << endl;
        sleep(1);
    }


    return 0;
}





// void handler(int signum)
// {
//     cout << "子进程退出:" << signum << " parent pid:" << getpid() << endl;
//     wait();
//     //10 子进程都退出
//     // while(wait())
//     // 10 5个子进程退出？
//     // 如果五个子进程退出，由于pending只有一位，所以父进程不知道有几个退出，所以父进程还会等待
// }


// // 证明子进程退出，会给父进程发信号
// int main()
// {
//     signal(SIGCHLD,handler);
//     if(fork() == 0)
//     {
//         cout << "child pid:" << getpid() << endl;
//         sleep(3);
//         exit(0);
//     }
//     while(true) sleep(1);


//     return 0;
// }






















// volatile int flag = 0;
// void changeflag(int signum)
// {
//     (void)signum;
//     cout << "change flag:" << flag;
//     flag = 1;
//     cout << "->" << flag << endl;

// }

// int main()
// {

//     signal(2,changeflag);
//     while(!flag);
//     cout << "进程成功推出" << endl;
//     return 0;
// }











// void showpending(sigset_t& appending)
// {
//     for(int sig = 1;sig <= 31; sig++)
//     {
//         if(sigismember(&appending,sig))
//         cout << "1";
//         else{cout << "0";}
//     }
//     cout << endl;
// }

// void handler(int signum)
// {
//     cout << "捕捉了一个信号：" << signum << endl;
//     sigset_t appending;
//     int c = 20;
//     while(true)
//     {
//         sigpending(&appending);
//         showpending(appending);
//         c--;
//         if(!c) break;
//         sleep(1);
//     }
// }

// int main()
// {
//     signal(2,SIG_IGN);
//     cout << "pid:" << getpid() << endl;
//     struct sigaction act,oact;
//     act.sa_flags = 0;
//     sigemptyset(&act.sa_mask);
//     act.sa_handler = handler;
//     sigaddset(&act.sa_mask,3);
//     sigaddset(&act.sa_mask,4);
//     sigaddset(&act.sa_mask,5);
//     sigaddset(&act.sa_mask,6);
//     // 设置进当前的调用进程的PCB
//     sigaction(2,&act,&oact);

//     cout << "default action:" << (int)oact.sa_handler << endl; // 老的默认捕捉方式,0默认，1忽略
//     while(true) {sleep(1);}
//     return 0;
// }